; (function ($, window) {
    'use strict'
    /**
     * 这是Corona对象的构造方法
     * @constructs Corona
     * @param {*} context 元素本身
     * @param {*} options 初始化选项
     */
    var Corona = function (context, options) {
        // 初始化选项
        this.$elem = context
        this.defaults = {
            pointOffsetX: 0,
            pointOffsetY: 0,
            rotateX: 0,
            num: 0
        }
        this.settings = $.extend({}, this.defaults, options)
    }

    Corona.prototype = {
        init: function () {
            // 初始化大转盘
            this.bg = this.$elem.find('.corona-bg')
            var bgProps = {
                width: this.bg.width(),
                height: this.bg.height(),
                x: this.bg.width() / 2,
                y: this.bg.height() / 2
            }

            this.$elem.css({
                'position': 'relative',
                'width': bgProps.width,
                'height': bgProps.height
            })

            this.bg.css({
                'position': 'absolute',
                'top': 0,
                'left': 0
            })

            // 初始化指针
            this.point = this.$elem.find('.corona-point')
            var pointProps = {
                width: this.point.width(),
                height: this.point.height()
            }
            this.point.css({
                'position': 'absolute',
                'left': this.settings.pointOffsetX || bgProps.x - pointProps.width / 2,
                'top': this.settings.pointOffsetY || bgProps.y - pointProps.height / 2
            })
        },
        /**
         * 旋转指针。该方法通过指定最终位置、旋转圈数和持续时间，计算出最终所需旋转的角度。
         * 指针将在指定时间内旋转该角度。
         * 
         * @function
         * @param position {number} 指针需要指向的位置，即转盘的第几个格子
         * @param duration {number} 持续时间，单位秒
         * @param circle {number}   指针最终指向指定位置前所需旋转的圈数
         */
        rotatePoint: function (position, duration, circle) {
            var deg = (position - 1) * 360 / this.settings.num + circle * 360
            this.point.css({
                'transform': 'rotate(' + deg + 'deg)',
                '-ms-transform': 'rotate(' + deg + 'deg)',
                '-webkit-transform': 'rotate(' + deg + 'deg)',
                '-moz-transform': 'rotate(' + deg + 'deg)',
                '-o-transform': 'rotate(' + deg + 'deg)',
                'transition': 'transform ease ' + duration + 's',
                '-moz-transition': '-moz-transform ease ' + duration + 's',
                '-webkit-transition': '-webkit-transform ease ' + duration + 's',
                '-o-transition': '-o-transform ease ' + duration + 's'
            });
        },
        /**
         * 旋转底盘，使指定位置与指针位置对齐。
         * 
         * @function
         * @param pos {number} 指针位置(第几个格子)
         * @param bgPos {number} 底盘位置(第几个格子)
         * @param duration {number} 持续时间，单位秒
         * @param circle {number}   指针最终指向指定位置前所需旋转的圈数
         */
        alignWheel: function (pos, bgPos, duration, circle) {
            var deg = -((bgPos - pos) % this.settings.num * 360 / this.settings.num) - circle * 360
            this.bg.css({
                'transform': 'rotate(' + deg + 'deg)',
                '-ms-transform': 'rotate(' + deg + 'deg)',
                '-webkit-transform': 'rotate(' + deg + 'deg)',
                '-moz-transform': 'rotate(' + deg + 'deg)',
                '-o-transform': 'rotate(' + deg + 'deg)',
                'transition': 'transform ease ' + duration + 's',
                '-moz-transition': '-moz-transform ease ' + duration + 's',
                '-webkit-transition': '-webkit-transform ease ' + duration + 's',
                '-o-transition': '-o-transform ease ' + duration + 's'
            });
        },
        /**
         * 重置，将转盘和指针恢复到初始位置
         * 
         * @function
         */
        reset: function () {
            this.bg.css({
                'transform': 'rotate(0deg)',
                '-ms-transform': 'rotate(0deg)',
                '-webkit-transform': 'rotate(0deg)',
                '-moz-transform': 'rotate(0deg)',
                'transition': '',
                '-moz-transition': '',
                '-webkit-transition': '',
                '-o-transition': ''
            })
            this.point.css({
                'transform': 'rotate(0deg)',
                '-ms-transform': 'rotate(0deg)',
                '-webkit-transform': 'rotate(0deg)',
                '-moz-transform': 'rotate(0deg)',
                'transition': '',
                '-moz-transition': '',
                '-webkit-transition': '',
                '-o-transition': ''
            })
        }
    }
    $.fn.corona = function (options) {
        var c = new Corona(this, options);
        c.init();
        return c;
    }
})(jQuery, window);